奥普特培训工程笔记
我们每天醒来,睁开双眼,就通过视觉感知这个世界。眼睛是我们获取信息最重要、最直接的通道,它帮助我们辨认方向、拿取物品、阅读文字,这一切都依赖于高效精准的生物视觉系统。 计算机作为人类最伟大的发明之一,自诞生之初就致力于模拟人脑的运算能力,协助我们处理繁重而重复的计算任务。从庞大笨重的大型机到今天功能强大的个人电脑、智能手机乃至超级计算机,其计算能力实现了跨越式发展。然而,一个仅有大脑而无法感知环境的系统能力终究受限。于是,我们开始为计算机装配感官,希望它能像我们一样看见和听见,从而执行更复杂的任务。
机器视觉与人工视觉的对比 在以往大批量工业生产过程中,主要靠人工视觉对产品进行测量、识别和分析。由于人工视觉处理时,效率低,稳定性差且精度不高,用机器视觉可以大幅度提高处理效率和自动化程度;同时,在一些不适合人工作业的危险工作环境或人眼难以满足要求的场合,也常用机器视觉来替代人眼,如核电站监控、晶圆缺陷检测;而且机器视觉易于实现信息集成,是实现计算机集成制造的基础技术之一。由于机器视觉系统可快速获取大量信息,且易于自动处理及信息集成,故在现代自动化生产过程中,机器视觉系统广泛用于装配定位、产品质量检测、产品识别、尺寸测量等方面。
机器视觉 人工视觉 效率 效率高 效率低 速度 速度快 速度慢 可靠性 检测效果稳定 易疲劳、有情绪,不易保持检测效果 工作时间 可24小时不停工作 容易疲劳,工作时间有限 信息集成 可实现信息集成 不易实现信息集成 成本 成本(一次投入) 成本高 环境 适于危险的检测环境 不适于危险的检测环境
在各类感知设备中,摄像头的作用尤为关键。 早期,它仅作为数字记录员负责拍摄与存储画面,图像中的内容与含义仍需人工解读。 随着技术发展,计算机逐渐能够处理一些有规律的视觉任务,例如自动对焦、图像定位、基础图案识别等,但这还远远不够。 当计算机的视觉能力从普通记录与识别,进一步转向在工业环境中执行精确检测,一门更专注、更强大的工程技术,机器视觉便应运而生。 【机器视觉是一门综合工程技术,通过集成相机、镜头、光源与计算机算法,为机器赋予视觉感知能力,使其能够在工业场景中自动完成检测、测量、识别与引导等任务。】
机器视觉系统简介 机器视觉顾名思义是使机器具有像人一样的视觉功能,从而实现各种检测、判断、识别、测量、定位等功能。机器视觉可以显著提高生产效率和自动化、智能化程度。一个典型的机器视觉系统包括:光源、镜头、相机、图像处理硬件、图像处理软件、执行单元等。 机器视觉综合了光学、机械、电子、计算机软硬件方面的技术,涉及图像处理、模式识别、人工智能、光机电一体化等多个领域。
一个成功的机器视觉应用。 首先需要运用好光,从而获得高对比度的图像,然后进行高速稳定的图像分析处理。光源发出的光照射在被检测的物体上,物体将光反射至镜头,再通过镜头成像至相机的传感器。相机将光信号转换成电信号,并传送给主机。通过运行在主机的软件分析图像,得到物体的相关信息,如尺寸、颜色、位置、是否存在缺陷等。
机器视觉主要分为图像采集硬件和视觉软件。其中视觉软件赋予机器大脑分析处理图像信息,最终完成识别、测量、定位检测等功能。
机器视觉系统工作原理 机器视觉系统通过图像采集硬件(相机、镜头、光源等)将光信号转换成图像信号,并传送给图像处理软件。图像处理软件根据像素亮度、颜色分布等信息,对目标进行特征提取,并做出相应的判断,根据结果输出来控制现场设备,实现检测功能。 视觉处理系统包含硬件和软件两方面。根据硬件的不同,机器视觉系统分为智能相机和基于PC的视觉系统。一个基于PC的机器视觉系统最为核心的部分由光源、镜头、相机、视觉处理系统四个部分组成。
镜头主要作用是将被测目标成像至摄像机的感光芯片上。 相机主要作用是采集图像,将光信号转换成电信号,从而输出图像给计算机。 软件的核心技术为图像处理及分析算法,它包括图像增强、图像分割、特征抽取、图像识别与分析等。通过图像处理与分析,对产品质量判断、尺寸测量,并将结果信号传输到相应的硬件进行显示或执行。
机器视觉发展趋势 随着机器视觉应用场景的复杂多样,其与深度学习算法、3D应用技术、互联互通标准等技术的融合也越来越紧密。 深度学习算法:深度学习算法模拟类似人脑的层次结构,通过深度神经网络建立从低级信号到高层语义的映射,以实现数据的分级特征表达。深度学习算法被引入机器视觉图像处理系统来进行外观检测,使识别过程更智能,视觉信息处理能力更强大。 3D应用技术:随着3D应用技术的不断深入,越来越多的3D重构技术被引入到机器视觉,如结构光、DFF、TOF、立体视觉、光度立体法等。3D图像处理与分析的算法也被研究得越来越广泛,将成为机器视觉的一个主流发展方向。 互联互通标准:机器视觉系统内部,以及与智能制造设备之间,与企业的管理系统之间,有必要进行互联互通,使设备和制造管理朝着更智能方向发展。目前视觉行业内部,包括EMVA、AIA、CMVA、JIIA等,合作制定了GenICam标准。AIA制定了GigE Vision,USB3 Vision等相机通信协议。视觉行业还与其他行业协会合作,不断拓展互联互通的外延,旨在促成视觉系统与其他行业的互联互通。
奥普特smart3 是一款高度开放易用的视觉软件,综合了近百个行业的视觉应用经验,遵循以人为本的设计理念,契合实际应用需求。Smart3 软件采用可视化图形编程,无需大量代码,使用简单易上手,快速响应需求,缩短项目开发周期。针对复杂的项目应用,Smart3 可新增子流程,为多工位运行提供简洁、可读性高的流程图。子流程支持事件触发或常驻运行方式,易复用和易理解。 Smart3 拥有丰富的界面控件,能快速实现界面布局和管控交互。设计以人为本,改善传统软件界面亲和力差的问题。在不停机、不停产的情况下,Smart3 支持在线调试,通过调整参数快速完成项目检测。Smart3 具有三百余种算法,集成2D、3D视觉及深度学习视觉应用,基于并行异构计算、任务级并发技术,可快速准确的分析图像信息。Smart3 软件支持脚本编程及开发扩展接口,可快速实现二次开发程序,满足用户自定义需求。Smart3 软件已在各行业数十万台设备稳定运行,如锂电、光伏、三C、电子、医药、液晶面板等。
Smart3 是opt公司推出的标准工业视觉软件,经过多年持续迭代与优化,目前已发展至成熟稳定阶段。截至2025.10.25,最新发布版本为Smart3 1.9.2.6,更新日期为2025.10.13。本次培训将使用Smart3 比1.9.2.0,该版本与最新版功能基本一致,不影响学习与实验。
软件版本号说明。Smart3 版本号采用四位数字标识。第一位是重大功能更新或架构调整,第二位是中等规模的功能增强,第三位是小幅功能改进或优化,第四位是问题修复与局部优化。
注意事项:
1. 双击获取到的安装包文件,启动安装程序。在语言选择界面中选择安装语言,点击确认,进入下一步。
2. 阅读软件许可协议,必须勾选我同意此协议方可点击下一步继续安装,否则将退出安装流程。
3. 选择软件安装路径,确认后点击下一步。
4. 在安装信息确认界面中核对设置,如无误则点击安装开始正式安装。
5. 安装完成后,点击完成退出向导,软件图标将默认创建于桌面。
注意事项:一、本安装流程适用于 smart3 v1.9系列 版本,其他版本可能存在差异。
二、如在安装过程中遇到任何异常或报错,建议截图保存,并及时联系研发或产品支持中心协助处理。
Smart3 、软件加密由verbox工具提供,分为线下的硬件加密狗和线上软件加密狗。Verbox工具在安装Smart3 时会自动捆绑安装,且默认随系统自启动,可以从Windows右下角小图标进入varbox界面进行查看。
加密狗型号区分为保障软件正常授权,请根据使用的Smart3 版本配套使用对应类型的加密狗。目前项目中使用的新旧两种加密狗外形相同,但互不通用,若使用错误将导致无法打开软件。
加密狗适用于Smart3 v1.7.0.0以下版本以及smart2 系列软件。新加密狗适用于Smart3 v1.8.1.0及以上版本。由于两种加密狗外观无差异,如需查看新旧加密狗类型,先打开右下角的verbox工具,点击切换到我的软件,找到界面中显示的加密狗许可。如未显示任何许可,则表示未识别到加密狗或该加密狗已失效。双击该许可项查看详细信息,点击更多查看加密狗产品ID,根据ID后缀判断类型,后缀为 150 即为新加密狗,其他后缀为旧加密狗或其他类型加密狗。 Smart3 软件的新加密狗根据功能权限划分为五种不同类型,旧加密狗不区分功能,统一具备完整权限。
对于Smart3 v1.8.1.0 以上版本,虽然安装包中已包含全部功能模块,如2D、3D、深度学习等,但实际可使用哪些功能取决于所使用的加密狗型号。若加密狗未授权某项功能,则对应模块将无法使用。如需查看当前加密狗权限,打开Smart3 软件,依次点击菜单帮助关于,在弹出窗口中即可查看当前识别的加密狗型号信息。
加密狗型号列表以及对应功能如下
| 存货名称 | 规格型号 |
|---|---|
| Smart3 智能视觉系统软件_全能加密狗 | Smart3-M |
| Smart3 智能视觉系统软件_2D 功能加密狗 | Smart3-U |
| Smart3 智能视觉系统软件_2D+深度学习 | Smart3-U-DL |
| Smart3 智能视觉系统软件_2D+3D | Smart3-U-3D |
| Smart3 智能视觉系统软件_定制款 | Smart3-S |
硬件加密狗使用。将加密狗插入到电脑端USB口,同时verbox界面识别到加密狗,确认加密狗信息无误后,即可开始使用Smart3 软件。软件加密狗使用获得软件狗授权码以后,打开vbox用户工具,点击云与软锁本地软锁授权码在线激活。进入授权码激活界面,将授权码输入对应位置,点击激活即可开始使用Smart3 软件。
==教学时分配的是 M 型==
软件安装完成且加密狗使用无误后,在桌面上找到 Smart3 软件,双击打开,进入 Smart3 软件界面。 最上一排属于菜单栏,包含菜单按钮、方案文件、操作方案、运行停止、切换、运行界面、一些必要的参数设置、一些使用小工具以及用户登录按钮。 左边是工具箱,Smart3 工具箱内工具分为十六个大类,点击、折叠或展开、收起、打开所有工具,同时支持搜索栏搜索,方便快速寻找工具。 正中间是流程图界面,它是Smart3 方案编写的主要区域,负责搭建方案、运行逻辑、图像与数据的处理以及收发规则等,同时可以在该区域切换、添加、删除子流程。 右边是当前算子块参数设置区,根据算子块类型显示对应的内容。 正下方是监控区域,可以在这里查看变量结果、算子工具结果、运行日志以及错误信息。

在工业自动化项目中,视觉系统充当设备的眼睛,负责定位物料位置或判断产品是否合格,就像人眼通过神经节将图像信息传递给大脑一样。在工厂中,视觉系统也需要将图像处理结果传输给机械手或其他自动化设备,而这离不开稳定可靠的通讯连接。
目前通讯方式多种多样,不同自动化设备厂商采用的通讯协议与通讯方式也各不相同,要逐一厘清各厂家在通讯机制上的差异并非易事。
然而,在Smart3 软件中,这一问题已得到有效解决。
软件已内置并封装了市面上常见的各类通讯方式,用户无需深入理解每种通讯背后的复杂原理,只需根据指引填写相应参数,即可快速与自动化设备建立连接,实现高效的数据交互。
接下来,我们将以最常用、通用且基础的 TCP/ IP 通讯为例,为大家演示具体操作流程,用来模拟视觉与其他自动化设备的交互。
TCP/ IP 通信协议是一套基于网络接口的通信规范,也是全球应用最广泛、最基础的一组网络协议。我们日常的上网浏览、在线游戏、短视频观看等都依赖于 TCP/ IP 协议来实现。无论是手机还是电脑,在接收和解析网络数据时均遵循该协议的规范。
TCP/ IP 协议的核心作用在于统一网络数据传输的格式与规则。它明确定义了数据中每个部分的用途、编码方式及组织结构,从而确保不同设备和系统之间能够准确高效的交换信息。
以上是 TCP/ IP 的一些相关知识,接下来让我们在Smart3 上动手连接并收发数据。
我们需要用到Smart3 软件以及模拟运控机械手的通讯助手。
首先让我们先打开Smart3 ,找到菜单栏的硬件设置,点击打开,把硬件设置切换到通讯页。在左侧通讯选择栏找到并切换 TCP/ IP ,在参数栏输入对应的连接参数。

针对这四位参数,需要注意的是。

一、驱动名称 是此连接在Smart3 上的一个标识,实际不干扰通讯连接。
二、模式 TCP/ IP 通讯需要客户端与服务端相连为一组通讯连接,所以互相通讯的两方需要是不同的模式。即Smart3 作为服务端时,要连接的对象必须是客户端,反之亦然。
三、主机IP IP是一个网络地址,每个网络上的设备都有它自己的IP地址,我们需要依靠这个IP地址在网络上寻找对应的设备。
电脑上IP地址的查看方式如下:在Windows任务栏或键盘上同时按住win加S找到搜索,在搜索框输入控制面板,找到后点击进入控制面板;再在控制面板中找到并进入网络和共享中心;在网络和共享中心中找到并点击更改适配器设置,打开网络适配器后会显示这台电脑所有的网络,找到需要查看的网络,如果无法区分,建议拔插网线,右键打开需要查看网络的选项,点击状态详细信息即可查看该网络的IP地址。
四、端口号 是当前IP地址下的 TCP/ IP 通讯的再次细分。如果把IP地址比作现实中大楼的地址,端口号就是具体房间号。回到我们Smart3 软件,将这四个参数一一输入,驱动名称和端口号在这里不做要求。模式选服务端与客户端皆可,这里我们先用服务端做演示。
==IP地址我们输入一个特殊的IP地址,127.0.0.1==,这个IP地址是Windows系统为本机预留的IP地址。即使没有连接网络,该IP地址也是连接状态,它是Windows预留用来调试以及本机内部通讯的地址。
设置完参数以后,我们点击添加,可以看到窗口中已出现一个连接,日志栏提示启动成功,但连接状态显示红色,即未连接。这就需要我们之前提到的通讯助手作为另一端来与它相连了。
打开通讯助手,选择对应的通讯模式,包括TCP server(服务端)和TCP client(客户端)。按照我们之前提到的 TCP/ IP 通讯模式,这里要选客户端才能与服务端的Smart3 相连。选择客户端后,点击左上角创建,在弹出的窗口中填上与Smart3 对应的参数,即IP地址与端口号需与Smart3 上保持一致。参数设置完成后,点击确认创建连接,再点击连接完成助手与Smart3 的连接。此时,如果Smart3 作为客户端连接,需要在Smart3 上点击配置完成并退出硬件设置界面。

完整配置示例:

如图所见的block1,
算子块(也称为普通算子块)的定义如下:
鼠标左键点击,选中流程图界面默认添加的算子块,再到左边工具箱,找到并打开通讯设置分类,在分类下鼠标双击 TCP/ IP ,进入 TCP/ IP 算子参数界面。

一、连接配置 在连接下拉框选择当前的连接,点击右侧的配置,进入之前的硬件设置界面,查看所有通讯连接。连接状态显示当前所选是否已连接。
二、模式与类型 模式与类型按需求选择,我们先测试Smart3 读取助手发过来的数据,默认的读类型使用默认的字符串,也就是我们常见的文字形式。另一种内存数据是一种更为基础的计算机数据类型,表现为一组组的十六进制数字。字符编码是将计算机二进制数字转换成字符的编码方式,我们使用默认的即可。
三、连接超时 表示该通讯算子运行超过多少毫秒以后,未接收到数据即报错并继续往下运行,下一个算子未打开此开关则默认是5000毫秒,这里我们使用默认即可。
四、保持连接 的作用是在连接异常断开的情况下,是否允许 Smart3 主动发起并重新建立连接。按照 TCP/ IP 客户端与服务端相连的模式,一般只有 Smart3 作为客户端时,此设置才有实际作用,这里我们默认即可。
五、清空缓存 是针对 TCP/ IP 通讯的另一种特质。 TCP/ IP 通讯并不是两个设备直接收发数据即可,而是两者在建立连接后会形成一个缓冲区间,可以理解成一个小型的存储空间。两边发送过来的数据都会先存在这个空间内,需要时再从空间内读取出来,这样可以有效防止某一方突然断开连接以后导致的数据丢失。清空缓存依旧默认即可。设置好参数后,点击右下角确定会退出参数设置界面并保存当前设置。

接收端配置:

可以看到 TCP/ IP 算子已经添加进入算子块内,现在我们可以来测试一下。切换到通讯助手,在输入框内输入要发送的字符,点击发送,再切换回Smart3 。
右键算子块,选择运行块。左键选中算子块内的 TCP/ IP 算子,下方的日志栏会显示当前所选算子的输出结果。我们再试一下从Smart3 发送数据到通讯助手。依旧从工具箱双击 TCP/ IP 算子,打开 TCP/ IP 算子参数。在算子参数界面,从读模式改为写。可以看到参数栏多了一些参数,主要用于自动为待发送的数据添加一些格式符。这里我们不用去特意设置其他参数,保持默认,在待发送数据框内填入我们想要发送的数据,再在右下角点击确认,即完成发送数据的配置。
发送端配置:

运行结果:

鼠标右键再次运行该算子块。运行完成后,可以看到通讯助手已经成功接收该数据。随后我们再测试几遍。
一、 在测试Smart3 发送数据时,我们等待了较长时间,主要因为在运行算子块时,同时会运行块内接收数据的 TCP/ IP 算子,此时助手并未发送数据过来,从而接收数据算子在延时等待,直到到达超时的时间,即 TCP/ IP 算子内的连接超时。
二、 以上收发数据,两个算子在一个算子块内的方式仅作为演示,实际现场一般不以此等方式使用。
将鼠标放置于任意箭头的线段上,可以添加流程控制模块

再配合流程控制模块共同实现视觉检测方案,其简介见下表 2.1.7。
| 图标 | 说明 | 备注 |
|---|---|---|
![]() |
主流程起始块 | 程序入口 |
![]() |
普通算子块 | 可添加不同算子实现图像获 取、检测算法和通信控制等 |
![]() |
条件分支算子块 | 程序结构控制,相当于 C 语 言中的 switch 语句 |
![]() |
多线程算子块 | 实现多线程运行,至少有两 个线程 |
![]() |
goto跳转块 | 实现算子跳转 |
![]() |
流程运行结束块 | 结束程序 |

goto块测试结果:


switch块测试:
发送【1】继续程序,发送其他任意字符结束程序




跳转位置选通讯块,跳转条件设置为通讯状态的值,false假




流程主要模块:【来料检测】

图像导入要注意勾选【图片循环加载】,让每次运行后切换下一张图

| 主要使用工具:【有无检测】—>【Blob分析】 | 【辅助工作】—–>【逻辑运算】 |


注意:【来料判断】–>【图形显示】要取消【清除窗口】


工业相机的成像过程是从光学信号转换为数字信号的过程。其内部基础结构主要包含以下部分:
镜头的成像是以凸透镜成像的原理为基础,通过透镜的组合,把物体发出或者反射的光线成像在像平面上(与芯片面重合) 。运用凹凸透镜组合能有效地平衡球差、轴外像差、色差等各种像差,提高成像质量。
成像的核心原理基于光电效应。
与光轴平行的光线射入凸透镜时,理想的镜头应该是所有的光线聚集在一点后,再以锥状扩散开来,这个聚集所有光线的点叫做焦点。对于单个透镜来说,焦距是指从光心到焦点的距离,如图一;对于多个透镜组成的镜头组来说,焦距是指像方主平面到焦点的距离,如图二。


在镜头内部,有一个多边形或者圆形且面积可变的孔状光栅装置,这个装置就叫做光圈。光圈的作用是控制镜头的通光量,通常用光圈系数来描述其大小。光圈系数是指镜头焦距 与整个镜头入瞳直径D的比值,通常用f/#来表示。其计算公式:f/#=f′/D。
f/#值越小,光圈越大。一般f/#值是以√2倍递增,因此光圈常用的计数为F1.4,F2.0,F2.8,F4.0……在同一单位时间内上一级的通光面积是下一级的两倍,例如光圈从f/8调整到f/5.6,通光面积便增加一倍。


光圈对图片亮度的影响:相同应用条件下,同一镜头,光圈越大,通光孔径越大,图片越亮。

工作距离(Working Distance):镜头聚焦清晰时,被测目标到镜头最前端的距离称为工作距离。实际应用中,镜头不能对任意物距下的目标都同时聚焦清晰,因此镜头的工作距离有一定范围。
1、视场角
在光学工程中,视场角是指镜头对图像传感器的张角,即若y’为Sensor的半对角线长度,则视场角2θ≈2*arctan(y’/f’)。
2、视野
视野(Field of View, FoV),也叫视场范围,是指镜头能观测到的实际范围。镜头的视野大小和相机的分辨率,决定视觉系统所能达到的视觉检测精度。

相同的工作距离下,焦距越短,视场角越大,视野也就越大;相同的焦距下,视场角一定,工作距离越远,视野越大。 
放大倍率定义为像的大小与物的大小之比。 -1<β <0时,物像异侧,成倒立缩小的实像,如AA′所示,这就是镜头的成像原理。 β=-1时,物像异侧,成倒立等大的实像,如BB′所示。 β<-1时,物像异侧,成倒立放大的实像,如CC′所示,这就是显微镜的成像原理。 β>0时,物像同侧,成正立放大的虚像,如DD′所示,这就是放大镜的成像原理。

分辨率是指光学系统可以测到的被测物体上的最小可分辨特征尺寸。镜头能分辨物体的细节越小,镜头的分辨率就越高。通常用像面处每毫米能够分辨的黑白相间的条纹对数(lp/mm)描述。 在实际应用中,建议镜头的分辨率不低于相机的分辨率。

景深:能在像平面上获得清晰像的物方空间深度。即:在被摄物平面(对焦点)前后一定范围内的物体,在无需调焦的情况下,其成像仍然清晰,这段可清晰成像空间深度就是景深。

影响景深的主要因素
1、镜头光圈
光圈越大,景深越小;光圈越小,景深越大。
2、镜头焦距
镜头焦距越长,景深越小;焦距越短,景深越大。
3、拍摄距离
距离越远,景深越大;距离越近,景深越小。
|
镜头光圈对景深的影响上面两张图同为OPT-C3514-5M镜头在相同工作距离下拍摄。左图的光圈为F1.4,右图的光圈为F16,可以看出右图的景深比左图的景深大。 |
镜头焦距对景深的影响 上面两张图片是在相同的光圈,相同的工作距离下拍摄的。左图是用OPT-C1218-5M拍摄的,焦距f’=12mm;右图则是用OPT-C3514-5M拍摄的,焦距f’=35mm。可以看出左图的景深比右图的景深大。 |
| ———————————————————— | ———————————————————— |
|
工作距离对景深的影响 上面两张图片是用镜头OPT-C3514-5M,在光圈相同的前提下,改变工作距离拍摄的。左图是的工作距离是1.2m,右图的工作距离是4.2m,可以看出右图的景深比左图的景深大。 |
| ———————————————————— |
光学畸变(distortion):由于镜头在不同视场放大倍率的不一样,使得像相对于物体失去相似性,这种像变形的缺陷称为光学畸变。光学畸变只影响成像的几何形状,并不影响成像的清晰度。常见的光学畸变主要有两种类型,桶形畸变和枕形畸变(如图)。

TV畸变是图像的视觉畸变的度量,TV畸变的定义有很多 。其中RIAA TV畸变计算公式如下:

1、法兰距:镜头法兰面到像面(芯片)的距离。
2、机械后截距:镜头最后的机械面到像面的距离。
3、光学后截距:镜头最后端镜片表面顶点到像面的距离。

注意:在购买显示器或电视时,参数中的“8bit”、“10bit”指的就是色彩/灰度位深度,数值越高,色彩过渡越自然,断层越少。
| 特性 | BMP格式 | JPG/PNG格式 |
|---|---|---|
| 压缩情况 | 无压缩 | 有压缩 |
| 数据完整性 | 完整保留,无失真 | 有丢失,算法拟合还原 |
| 文件体积 | 大 | 小 |
| 适用场景 | 图像处理、机器视觉 | 日常查看、网页展示 |
二值化是计算机视觉中最基础、最简单且最常用的算法之一,常用于提取目标物体(如测量电容半径、定位位置等)。
原理与步骤
二值化的类型
形态学主要用于去除噪点、平滑边界或连接断裂区域。
基础操作
复合操作 为了在去噪的同时尽量保持物体原有的形状特征,常将腐蚀和膨胀结合使用:
通道提取主要针对彩色图像。大部分图像处理算法(如找圆、找线、匹配)仅针对黑白图像,因为黑白图像单通道计算量小,特征计算更简单直白。
彩色转黑白原理
转换方法
注意:不同的通道提取模式可能会产生意想不到的处理效果。
独立预处理工具:处理后的图像可以输出,供后续其他工具使用。
工具内置预处理:许多算法工具(如找圆)内部自带预处理选项。其处理方式与独立工具一致,但处理结果仅供该工具内部使用,不会对外输出图像。
Blob分析是工业机器视觉中功能强大且原理相对简单的核心工具,常用于有无检测。
核心原理
参数设置与功能
结果筛选 Blob分析会输出每个连通区域的详细数据,用户可根据这些数据进行筛选,去除干扰:
输出结果
定位与检测的关系
ROI与Mask概念
工业定位的高标准要求
双层定位嵌套策略 为了满足高精度与高稳定性,工业上常采用“粗定位+精定位”的嵌套模式:
常见工具
这是最常用且基础的匹配方式。
操作流程
核心原理
轮廓匹配参数优化
原理
关键参数
原理
参数设置
原理
ROI形状
功能
操作方法

图像导入:勾选【图像循环加载】
Blob分析:删除默认的 Roi 框,参考跳转到指定位置
ROI 校正基准设置:如图

找直线 1 ~ 4 :


如上操作依次找到手机框架最外面的四条边
几何关系 1 ~ 4 :
找相邻两条边的交点

几何关系 5 ~ 6 :
找到两点的对角线

元素选择对角的两个点,结果勾选拟合线。
几何关系 7 :
找到对角线的交点

元素选择两条对角线,结果勾选交点。
添加延时(300ms):



图像导入:开启循环
灰度匹配:

使用画矩形,框选工件
ROI基准设置

找圆

时间:延时300ms




【事件设置】勾选 延时【找 圆/方 跳转】 结束 【状态】

找方 **参考 工程三,找圆** 参考 工程四


N: number 数字变量,数据是表示数量、可以进行数值运算的数据类型。
数值型数据由数字、小数点、正负号和字母 E 组成,用字母 N 表示。数值型数据的取值范围是:-0.9999999999E+19+到 0.9999999999E+20,包括正负号、小数点和字母 E 在内,其长度最大 20 位。通常用于表示实数。
S: string 字符串变量,由数字、字母、下划线组成的一串字符。在脚本中使用时需要用英文的单引号‘’或者双引号“”引用起来。 B: bool 布尔变量,尔型变量只有两个值,即 false(假)和 true(真)。 P: point 坐标点变量 [不是指针],其成员有两个,即 Point x 和 Point y。 3D_P:3D 点类型:其成员有三个,即 Point x 和 Point y 和 Point z。 3D_PL:3D 平面类型: 其成员有四个,即 A、B、C、D,ABC 是平面的向量(X,Y,Z),D 是原点到平面的距离(存在正负)。 M: 矩阵类型:其成员有两个,即行跟列,可以自定义矩阵大小,通过行数、列数来设置,矩阵最小是 2*2。

// 数值/字符数组/布尔变量的赋值
Vars.Var1 = 78
Vars.Var2 = "fshifaf的萨芬1324=-"
Vars.Var3 = true
// 点变量的赋值
Vars.Var4.x = 2
Vars.Var4.y = 1
Vars.Var4 = {x:3,y:5}
// 数值/字符 数组元素的赋值
Vars.Var5[3] = 21
Vars.Var6[2] = "sdfsa"
// 基本运算
Vars.Var1 = 7/8
Vars.Var2 = "abc"+"123"
// 变量名可以是中文
var 中文 = 1234
// if结构测试
var a = 10
var b = 20
if (a > b)
{
Vars.Var1 = b
}
else
{
Vars.Var1 = a
}
// switch结构测试
var n = 3
switch(n)
{
case 1:
Vars.Var2 = "a"
break;
case 2:
Vars.Var2 = "b"
break;
default:
Vars.Var2= "n"
break;
}
// while结构测试
var a = 0
while(true)
{
Vars.Var1 = Vars.Var1 + a
a++
if(a > 100)
{
break;
}
}
Vars.Var1 = 0
Vars.Var2 = ""
for(i = 0; i<10; i++)
{
for(j = 0; j<10; j++)
{
Vars.Var2 += i+"*"+j+"="+i*j+" "
}
}
// 常用Jscript函数
var s = "T1,1,3.786,3,60"
Vars.Var6 = s.split(",")
Vars.Var1 = parseInt(Vars.Var6[2])
var n = 3.2432523
Vars.Var2 = n.toFixed(3)
Vars.Var1 = Math.round(n*1000)/1000

图像导入:取消图片循环,参考跳转到指定位置
灰度匹配:添加匹配数目 (10)

脚本配置 :
先添加这四个变量

脚本内容
Vars.P_当前参考点 = 粗定位_灰度匹配_1.centers[Vars.N_定位计数]
Vars.N_当前参考角度 = 粗定位_灰度匹配_1.angles[Vars.N_定位计数]
Vars.N_定位计数 ++
Vars.B_定位结束 = false
if(Vars.N_定位计数 >= 粗定位_灰度匹配_1.centers.length)
{
Vars.B_定位结束 = true
Vars.N_定位计数 = 0
}
ROI校正基准设置 :

找圆 : 注意上一步的ROI在哪一块【看红十字位置】


时间 :延时300ms
OCR:同样注意ROI的位置,使用预训练模型



Blob分析:

脚本:
变量内容:

脚本内容:
Vars.P_当前参考点 = 粗定位_Blob分析_1.center[Vars.N_定位计数]
Vars.N_当前参考角度 = 粗定位_Blob分析_1.angle[Vars.N_定位计数]
Vars.N_定位计数++
Vars.B_定位结束 = false
if(Vars.N_定位计数 >= 粗定位_Blob分析_1.count)
{
Vars.N_定位计数 = 0
Vars.B_定位结束 = true
}
ROI校正基准设置:

注意:做完这一步后运行一下算子块,看当前ROI定位在哪一个目标上
找直线 1 ~ 4,几何关系 1 ~ 7:
参考工程三,主要目的是找中心点坐标。
时间:
延时300ms

流程类似于 工程五 , 区别在于: 本工程分支流程中不要单独设置tcp通讯发送到通讯助手,而是将数据写入通讯字符变量,最后交由主流程统一发送


最后的【发送数据】算子块内 填 上面设置的变量


注意:换行是\r\n

调整参数,大致匹配整个工件

注意结果输出设置


精确匹配pin针,
注意开启ROI校正(图见此页:跳转到指定位置)
【参数设置如下】


注意上一步中ROI十字在哪一个pin针上

注意:换行是\r\n

注意【匹配数目】的值


注意上一步中ROI十字在哪一个工件上
注意开启ROI校正(图见此页:跳转到指定位置)



先添加一个【指令类型】的 N类型数据

填加一个【脚本】算子

脚本内容:
//判断通讯是否有信号
Vars.N_指令类型_G = 0
if(通讯_TCP_IP_1.stepStatus)
{
//指令拆分
var ss = 通讯_TCP_IP_1.dataString.split(",")
Vars.N_指令类型_G = parseInt(ss[1])
}
更改为对应的条件


Vars.P_测量点位 = 粗定位_Blob分析_2.center[Vars.N_测量计数]
Vars.N_测量计数 ++
if(测量_卡尺_1.stepStatus)
{
Vars.S_卡尺显示 = Vars.N_测量计数+"\r\nOK\r\n"+
"中心X:"+Vars.P_测量点位.x.toFixed(3)+"\r\n"+
"中心Y:"+Vars.P_测量点位.y.toFixed(3)+"\r\n"+
"宽度:"+测量_卡尺_1.caliper_width.toFixed(3)
Vars.S_发送数据 += Vars.N_测量计数+":OK,"
+测量_卡尺_1.caliper_width.toFixed(3)+";\r\n"
}
else
{
Vars.S_卡尺显示 = Vars.N_测量计数+"\r\nNG\r\n中心X:0\r\n中心Y:0\r\n宽度:0"
Vars.S_发送数据 += Vars.N_测量计数+":NG,0;\r\n"
}
//判断是否结束
Vars.B_测量结束标志 = false
if(Vars.N_测量计数>=粗定位_Blob分析_2.count)
{
Vars.N_测量计数 = 0
Vars.B_测量结束标志 = true
}
在【测量】算子块与【goto1】算子块中添加一个【数据显示与导出】算子块

时钟记录,用于csv导出

在图像窗口显示数据,注意关闭【清除窗口】选项

用于延时,增加数据显示间隔

注意:
剩余配置如下图


同【图像导出-OK原图】,不同点在于保存条件的选【否】
类似上一步
注意:【图像导出-NGxx图】算子状态为 NG 是正常的

如图:
如果有某些数据没有则去对应的算子【结果数据】开启对应的数据【全流程】有效,具体跳转 跳转到指定位置

也添加一个【数据显示与导出】算子块,类似【卡尺】
提示:由于目前版本延时有点小问题,最好把【数据显示】相关的两个算子放入【测量】算子块

最后导出的数据结果,这里只列出导出的文件结构与csv文件内容:
wxz@LAPTOP-CJNATPRL:/mnt/c/Users/wxz/Desktop/opt奥普特实践/02-资料/串口与齿轮$ tree
.
├── 多点卡尺图
│ └── 卡尺测量
│ └── 2026-04-04
│ ├── 2026-04-04.csv
│ └── 卡尺测量
│ └── OK
│ ├── 原图
│ │ ├── 2026-04-04_22-13-43-372.bmp
│ │ ├── 2026-04-04_22-13-44-027.bmp
│ │ ├── 2026-04-04_22-13-44-678.bmp
│ │ ├── 2026-04-04_22-13-45-354.bmp
│ │ ├── 2026-04-04_22-13-46-008.bmp
│ │ ├── 2026-04-04_22-13-46-659.bmp
│ │ ├── 2026-04-04_22-13-47-317.bmp
│ │ ├── 2026-04-04_22-13-47-970.bmp
│ │ ├── 2026-04-04_22-13-48-644.bmp
│ │ ├── 2026-04-04_22-13-49-300.bmp
│ │ ├── 2026-04-04_22-13-49-987.bmp
│ │ └── 2026-04-04_22-13-50-645.bmp
│ └── 窗口图
│ ├── 2026-04-04_22-13-43-373.bmp
│ ├── 2026-04-04_22-13-44-027.bmp
│ ├── 2026-04-04_22-13-44-678.bmp
│ ├── 2026-04-04_22-13-45-355.bmp
│ ├── 2026-04-04_22-13-46-008.bmp
│ ├── 2026-04-04_22-13-46-659.bmp
│ ├── 2026-04-04_22-13-47-317.bmp
│ ├── 2026-04-04_22-13-47-970.bmp
│ ├── 2026-04-04_22-13-48-644.bmp
│ ├── 2026-04-04_22-13-49-300.bmp
│ ├── 2026-04-04_22-13-49-987.bmp
│ └── 2026-04-04_22-13-50-645.bmp
└── 多点找圆图
└── 2026-04-04
├── 2026-04-04.csv
└── 找圆
└── OK
├── 原图
│ ├── 2026-04-04_22-13-37-537.bmp
│ ├── 2026-04-04_22-13-38-177.bmp
│ ├── 2026-04-04_22-13-38-852.bmp
│ ├── 2026-04-04_22-13-39-523.bmp
│ ├── 2026-04-04_22-13-40-160.bmp
│ └── 2026-04-04_22-13-40-798.bmp
└── 窗口图
├── 2026-04-04_22-13-37-538.bmp
├── 2026-04-04_22-13-38-177.bmp
├── 2026-04-04_22-13-38-852.bmp
├── 2026-04-04_22-13-39-523.bmp
├── 2026-04-04_22-13-40-160.bmp
└── 2026-04-04_22-13-40-798.bmp
14 directories, 38 files
wxz@LAPTOP-CJNATPRL:/mnt/c/Users/wxz/Desktop/opt奥普特实践/02-资料/串口与齿轮$ cat 多点找圆图/2026-04-04/2026-04-04.csv
时间,序号,状态,中心X,中心Y,
2026.04.04 22.13.36.926,1,True,809.017,628.758,
2026.04.04 22.13.37.569,2,True,426.802,444.874,
2026.04.04 22.13.38.232,3,True,845.736,204.645,
2026.04.04 22.13.38.901,4,True,1267.115,651.342,
2026.04.04 22.13.39.551,5,True,449.129,867.442,
2026.04.04 22.13.40.189,0,True,1192.077,378.110,
wxz@LAPTOP-CJNATPRL:/mnt/c/Users/wxz/Desktop/opt奥普特实践/02-资料/串口与齿轮$ cat 多点卡尺图/卡尺测量/2026-04-04/2026-04-04.csv
时间,序号,状态,中心X,中心Y,宽度,
2026.04.04 22.13.42.764,1,True,791.000,839.000,34.372,
2026.04.04 22.13.43.415,2,True,877.500,839.000,31.640,
2026.04.04 22.13.44.070,3,True,1019.500,839.000,32.871,
2026.04.04 22.13.44.740,4,True,1093.361,838.992,31.936,
2026.04.04 22.13.45.397,5,True,1172.500,839.000,32.265,
2026.04.04 22.13.46.049,6,True,1248.500,839.000,32.830,
2026.04.04 22.13.46.707,7,True,1388.500,839.000,33.281,
2026.04.04 22.13.47.360,8,True,1473.174,838.992,31.263,
2026.04.04 22.13.48.030,9,True,1551.000,839.000,33.383,
2026.04.04 22.13.48.690,10,True,1627.000,839.000,31.647,
2026.04.04 22.13.49.372,11,True,1770.871,838.989,31.520,
2026.04.04 22.13.50.033,0,True,1848.280,839.006,34.586,
本文参考相机标定:从入门到实战 - 知乎

相机标定的目的就是找到相机的数学模型,得到这个数学模型的函数映射关系,求出这个数学模型中参数。另外通过求解这个函数的“反函数”(成像的反过程),根据获得的二维图片恢复三维场景。


维度:2D (二维)
定义与原点
:建立在图像平面(Image Plane)上的坐标系。
位置:位于透镜前方距离为焦距 f 的位置(即 Z=f 处)。
作用:描述三维物体投影到二维成像平面上的具体位置。
总结关系: 光线从世界坐标系中的物体发出,经过相机坐标系(以透镜中心为原点)的投影变换,最终落在图像坐标系/像素坐标系(2D平面)上形成图像。




导入如下图片,取消勾选【图片循环加载】

先删除默认的ROI框,参考跳转到指定位置
然后如图,注意排序,从左到右,从上到下

注意设置世界坐标九点

Vars.P_标定参考点 = 标定粗定位_Blob分析_1.center[Vars.N_标定计数]

注意上一步的ROI基准校正设置 红色十字在哪里

Vars.PA_相机坐标九点[Vars.N_标定计数] = 标定精定位_找圆_1.center
Vars.N_标定计数 ++
Vars.B_标定完成 = false
if(Vars.N_标定计数>=9)
{
Vars.N_标定计数 = 0
Vars.B_标定完成 = true
}


工业视觉项目核心硬件(图像采集相关):相机、镜头、光源(硬件连接将在实操培训中学习)。
核心工作流程:流水线工件流过后,通过光源、相机、镜头采集图像 → 图像传输至电脑处理 → 处理后输出结果 → 控制机械手等执行动作。
基础硬件示例:环形光源、定焦镜头、普通2D相机(本次讲解均围绕2D相机,3D相机后续另行了解);相机成像原理基于光电效应,本次在前期基础上进一步深入。
补充:相机24V电源口,原用于CCD相机供电,现可用于供电或连接触发线(IO线),多数CMOS相机可通过数据传输口直接供电。
彩色相机、黑白相机。
常用接口:网口、USB口(四种接口均有应用,以这两种为主)。
将目标物体的光线汇聚到相机传感器芯片上,实现清晰成像。
相机从上往下拍摄梯形工件:
调形光源、环形光源(可平面/斜角照射,中间可放置镜头)、面光、组合光、同轴光(镜头取光与光源出光方向一致)、球积分光(四面打亮)、远心光、背光。
又称视觉引导定位,核心是“定位抓取+定位放置”,即通过视觉引导机械手,将目标物体(如电池)抓取并精准放置到指定位置(如手机背框),是工业上常见的项目类型。
核心:通过相机拍照,结合标定,计算出目标物体与视觉点的实时偏移量,无需手动测量固定偏移,可应对物体乱放的场景。
重点:当目标物体存在角度偏差时,需解决“角度转正后位置偏移”的问题,核心是确定机械手的旋转中心。
贴合项目分单相机、双相机两种场景:双相机需分别拍摄抓取位和放置位;单相机仅拍摄一个位置即可。核心参数包括视角位、模板位、实时位(拍照位不重要)。
要求:后续升L2考核需完全掌握贴合项目的流程和操作。
素材:同工程10,见:点击跳转



注意:
【生成标定】–>【多点标定】–>【结果输出】


这里只说明【定位流程】的细节






if(定位_灰度匹配_1.stepStatus&&定位_找圆_1.stepStatus&&定位_找直线_1.stepStatus
&&定位_找直线_1.angle<Vars.N_角度上限&&定位_找直线_1.angle>Vars.N_角度下限)
{
Vars.S_发送数据_G = "A,OK,"+定位_标定转换_1.定位_找圆_1_center_calib.x.toFixed(3)+","+定位_标定转换_1.定位_找圆_1_center_calib.y.toFixed(3)+","+定位_标定转换_1.定位_几何关系_1_mindistance_calib.toFixed(3)
Vars.N_定位OK计数++
}
else
{
Vars.S_发送数据_G = "A,NG,0,0,0"
Vars.N_定位NG计数++
}
Vars.N_定位总数++




略
见结果,细节略





这个工程的步骤细节就不列了,这里主要记录一下我的失误和不足
明明九个相机坐标和对应的世界坐标生成好了,但标定生成失败
解决:

【标定设置】–>【坐标系管理】设置的问题,新建相机坐标系与世界坐标系。
Jscript 脚本常用的几个函数记不清楚,使用时还要翻笔记。
解决:
# 牢记这几个
# 分割字符串
split
# 字符转数值
parseInt
parseFloat
# 控制小数点位数
toFixed
变量设置不清晰,写脚本时,在计数时本来应该用“工件一计数”,结果使用的是“标定计数”
在找直线时总有一条边匹配失败
解决:
在找线的【参数设置】前,先【预处理】 使用二值化
因为算子的大部分输出值都是在所在的算子快内有效,我流程分得太细,总是要去上一个算子块中去调整算子输出值的可用范围。
酌情优化:
合并部分流程,把算子放入一个算子块。
通讯连接状态(不是通讯状态)—已解决 日志刷新—已解决 表格标红—已解决
工件一部分,要逐个ROI变量12个位置,当前我是使用(12-工件数目) 工件二的中心应该是最中间的小方块中心,当前我是电池极耳底下一条线的中点

略略略……